package com.hag.equipment_server.netty.server;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import lombok.extern.slf4j.Slf4j;

import java.nio.ByteOrder;

/*暂时不用这个类*/
@Slf4j
public class MyDecoder extends LengthFieldBasedFrameDecoder {

    /**
     * 我们在Message类中定义了type和length，这都放在消息头部
     * type占1个字节，length占4个字节所以头部总长度是5个字节
     */
    private static final int HEADER_SIZE = 9;
    int LEN;

    /**
     *
     * @param maxFrameLength   网络字节序，默认为大端字节序
     * @param lengthFieldOffset 消息中长度字段偏移的字节数
     * @param lengthFieldLength 数据帧的最大长度
     * @param lengthAdjustment 该字段加长度字段等于数据帧的长度
     * @param initialBytesToStrip 从数据帧中跳过的字节数
     * @param failFast 如果为true，则表示读取到长度域，TA的值的超过maxFrameLength，就抛出一个 TooLongFrameException
     */
    public MyDecoder(ByteOrder byteOrder, int maxFrameLength, int lengthFieldOffset,
                     int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip,
                     boolean failFast) {
        super(maxFrameLength, lengthFieldOffset, lengthFieldLength,
                lengthAdjustment, initialBytesToStrip, failFast);
    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
        if(in == null){
            return null;
        }
        if(in.readableBytes() < HEADER_SIZE){
            return null;
        }

        /**
         * 通过源码我们能看到在读的过程中
         * 每读一次读过的字节即被抛弃
         * 即指针会往前跳
         */

        //header
        byte SOF = in.readByte();
        LEN = in.readIntLE();

        //如果当前可读的字节数 小于本次数据的字节数 说明发生了粘包问题 立刻返回 等待下次读取完整数据
        if(in.readableBytes() < LEN){
            return null;
        }

        byte ACK_VER = in.readByte();
        byte COMMAND_ID = in.readByte();
        short CRC16 = in.readShort();
        Header header = new Header(SOF,LEN,ACK_VER,COMMAND_ID,CRC16);




        //body
        ByteBuf buf = in.readBytes(LEN);
        byte[] body = new byte[buf.readableBytes()];
        buf.readBytes(body);

        //tail
        ByteBuf buf1 = in.readBytes(4);
        byte[] tail = new byte[buf.readableBytes()];
        buf.readBytes(tail);


        Message msg = new Message();
        return msg;
    }
}
